#ifndef	_J_DRETVE_H_
#define	_J_DRETVE_H_

//javno  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include <dretve.h>

#include "tipovi.h"
#include "prioriteti.h"

//osnovno s dretvama - j-funkcije
int j_stvori_dretvu ( void *param );
int j_dretva_odstupi ( void *param );
int j_dretva_zavrsetak (void *param );
int j_zavrsi_dretvu ( void *param );
int j_id_dretve ( void *param );
int j_dohvati_prioritet ( void *param );
int j_dohvati_nacin_rasporedjivanja ( void *param );
int j_postavi_prioritet ( void *param );
int j_cekaj_kraj_dretve ( void *param );
//int j_zaustavi_latentnu_dretvu (void *param);

//javno  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#if	defined(_J_DRETVE_C_) || defined(_J_RED_C_) ||			\
	defined(_J_SINKRONIZACIJA_C_) || defined(_J_DOGADJAJI_C_) ||	\
	defined(_J_PROCESI_C_)

//samo za dretve.c i "prijatelje"  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include "dogadjaji.h"

#include <arh/kontekst.h>

typedef struct _j_dretva_t_ {
	int id;			//id dretve
	int id_procesa;		//id procesa kome dretva pripada

	int prio;		//prioritet
	int rasp;		//nacin rasporedjivanja

	struct _j_dretva_t_ *iduci; //pokazivac na iduci opisnik dretve u
				//redu u kom se i ova nalazi, NULL ako je zadnja

	struct _j_dretva_t_ *iduci_p; //pokazivac na iduci opisnik dretve u
				//procesu u kojem se dretva nalazi

	int red;		//u kojem je stanju/redu, 0-Akt, 1-pripr

	int alarm;		//id alarma koji ce prekinut cekanje ove dretve
				//u nekom redu (ako je != -1)

	int kraj;		//id reda dretvi koje cekaju kraj ove dretve

	din_prio_t dp;		//struktura za cuvanje dinamicki povecanih
				//prioriteta (i njihovo vracanje)

	j_red_dog_dretve_t red_dog; //red dogadjaja poslanih dretvi

	int *povvr;		//adresa za povratnu vrijednost (za naknadno
				//mijenjanje)


	//mjesto za kontekst - "stog" za ring 0, kad se dogodi prekid
	arh_kontekst_t kontekst; //samo za obicne dretve

} j_dretva_t;

//struktura za ostavrenje reda dretvi (lista)
typedef struct _j_lista_dretvi_t_ {
	j_dretva_t *prvi;
	j_dretva_t *zadnji;
} j_lista_dretvi_t;

#endif	/* _J_DRETVE_C_ i ostale */

//samo za jezgru
void j_visedretvenost_inicijaliziraj ();

void j_aktiviraj_prvu_pripravnu();

void j_samo_stavi_u_pripravne (void *opd);

int j_povecaj_prioritet (int id_dretve, int nprio, void *razlog);
int j_vrati_prioritet (int id_dretve, void *razlog);
int j_promijeni_prioritet (int id, int nprio);

void j_postavi_dretvin_alarm(void *opd, void *koliko);
void j_obrisi_dretvin_alarm(void *opd);

void j_odblokiraj_dretvu (void *opd);

void j_pohrani_okolinu_dretve(void *kontekst);
void j_zapisi_adresu_povratne_vrijednosti(int *ppovvr);

int j_stvori_dretvu_i (void *param, int id_procesa);

//dohvat elemenata opisnika (za jezgrine funkcije)
inline void *j_aktivna_dretva();
inline void *j_dohvati_opisnik(int id);

inline void *j_dohvati_kontekst_aktivne ();
inline void *j_opdr_kontekst(void *opd);

inline int j_aktivni_proces();

inline int j_opdr_id(void *opd);
inline int j_opdr_id_procesa (void *opd);

inline int j_opdr_prio(void *opd);

inline int j_opdr_red(void *opd);
inline void j_opdr_postavi_red(void *opd, int red);

inline void *j_opdr_red_dog(void *opd);

#endif	/* _J_DRETVE_H_ */